# Darren
# 2025年02月20日09时44分05秒
# 面向对象  一个类 实例化多个对象 根据职责在类内封装不同的方法
class Person:
    def __init__(self, name, age, weight):  # 属性（初始化）
        self.name = name
        self.age = age
        self.weight = weight

    def run(self):  # 方法
        self.weight -= 0.5
        print(f"{self.name}跑步了，体重减少0.5公斤{self.weight}")

    def eat(self):  # 方法
        self.weight += 1
        print(f"{self.name}吃大餐，增加1公斤{self.weight}")


class Cat:
    def __init__(self, new_name):
        self.name = new_name
        print("%s 来了" % self.name)

    # __xx()__是内置方法 ,属于回调函数，并非程序员自己调用
    # __del()__ 对象销毁前执行的代码，主要用于记录对象被销毁的日志
    def __del__(self):
        print("%s 我去了" % self.name)

    # __str()__ 返回print输出对象变量时，打印的内容
    def __str__(self):
        # 必须返回一个字符串
        return "我是小猫[%s]" % self.name


if __name__ == '__main__':
    elephant = Person("大象", 18, 80)  # 实例化对象
    tiger = Person("老虎", 17, 60)
    tiger.run()
    elephant.run()  # 不同对象的方法指向内存的同一位置
    elephant.eat()
    elephant.age = 20  # 属性修改 （可变数据类型）

    # __dir()__
    print(dir(Person))  # 查找类内置方法
    print(dir(elephant))  # 查看对象的所有属性和方法

    tom = Cat("Tom")

    print(tom)

    del tom  # 删除一个对象


# 摆放家具
# 被使用的类，通常应该先开发
class HouseItem:  # 家具
    def __init__(self, name, area):
        self.name = name
        self.area = area

    def __str__(self):
        return "[%s] 占地 %.2f" % (self.name, self.area)


class House:  # 房子
    def __init__(self, house_type, area):
        self.house_type = house_type
        self.area = area
        # 剩余面积
        self.free_area = area
        # 家具名称列表
        self.item_list = []

    def __str__(self):
        return ("户型：%s\n 总面积：%.2f[剩余：%.2f]\n 家具：%s"
                % (self.house_type, self.area,
                   self.free_area, self.item_list))

    def add_item(self, item: HouseItem):  # :类名 注解作用
        print(f"要添加{item}")  # 调用HouseItem 类的__str()__方法
        if self.free_area >= item.area:
            self.item_list.append(item.name)
            self.free_area -= item.area
        else:
            print("房间空间不足")


# 1. 创建家具
bed = HouseItem("席梦思", 4)
chest = HouseItem("衣柜", 2)
table = HouseItem("餐桌", 1.5)

# print(bed)
# print(chest)
# print(table)

# 2. 创建房子对象
my_home = House("两室一厅", 60)

# 3. 添加家具
my_home.add_item(bed)
my_home.add_item(chest)
my_home.add_item(table)
print(my_home)

# 身份运算符 is ,is not
a = [1, 2, 3]
b = [1, 2, 3]
print(a == b)  # 数值相等 True
print(a is b)  # id(a),id(b)是否相等 False


# 私有属性，私有方法
class Women:
    def __init__(self, name, age):
        self.name = name
        self.__age = age  # 私有属性，只能在类内部访问

    def __secret(self):  # 私有方法,只能在类内部访问
        print(self.__age)

    def boyfriend(self):
        self.__secret()


if __name__ == '__main__':
    xiaohong = Women("小红", 18)
    # print(xiaohong.age)  # 'Women' object has no attribute 'age'
    xiaohong.boyfriend()
